package dmon;

import java.util.Iterator;
import java.util.LinkedList;

/**
 * Universidad Simón Bolívar
 * Curso de Redes I - Taller
 * Profesor: Ricardo Gonzalez
 * Trimestre Enero-Marzo 2011
 *
 * Proyecto 2 RD
 *
 * @author Grupo 9
 * @author Richard Simoes Ferreira
 * @author Ricardo Tocco
 *
 * @version 1.0
 *
 */

public class ControlDmon {

 /**
 * Estructura de control para el programa dmon
 */
    private int puerto;
    private int subirDrep;
    private int bajarDrep;
    private int activosDrep;
    private LinkedList <String> activosDcli;
    private boolean listening;

    /**
     * Constructor de la clase ControlDmon
     * @param p Puerto bien conocido del servidor dmon
     */
    public ControlDmon (int p){
        this.puerto = p;
        this.subirDrep = 0;
        this.bajarDrep = 0;
        this.activosDrep = 0;
        this.activosDcli = new LinkedList <String> ();
        this.listening = true;

    }
    /**
     * Obtener el puerto bien conocido que utiliza el servidor dmon
     * @return  Puerto bien conocido que utiliza el servidor dmon
     */
    public int getPuertoDrep(){
        return this.puerto;
    }
    /**
     * Establece el puerto bien conocido que utiliza el servidor dmon
     * @param p Puerto bien conocido que utiliza el servidor dmon
     */
    public void setPuertoDrep(int p){
        this.puerto = p;
    }
    /**
     * Obtiene el número de subidas de archivos (uploads) que se han realizado
     * en todo el sistema RD
     * @return  número de uploads del sistema RD
     */
    public int getSubidosDrep(){
        return this.subirDrep;
    }
    /**
     * Establece el número de subidas de archivos (uploads) que se han realizado
     * en todo el sistema RD
     * @param subidos   uploads del sistema RD
     */
    public void setSubidosDrep(int subidos){
        this.subirDrep = subidos;
    }
    /**
     * Incrementa en uno el número de subidas de archivos (uploads) que se han
     * realizado en todo el sistema RD
     */
    public void incrementarSubidosDrep(){
        this.subirDrep++;
    }
    /**
     * Decrementa en uno el número de subidas de archivos (uploads) que se han 
     * realizado en todo el sistema RD
     */
    public void decrementarSubidosDrep(){
        this.subirDrep--;
    }
    /**
     * Obtiene el número de bajadas de archivos (downloads) que se han
     * realizado en todo el sistema RD
     * @return  downloads del sistema RD
     */
    public int getBajadosDrep(){
        return this.bajarDrep;
    }
    /**
     * Establece el número de bajadas de archivos (downloads) que se han 
     * realizado en todo el sistema RD 
     * @param bajados
     */
    public void setBajadosDrep(int bajados){
        this.bajarDrep = bajados;
    }
    /**
     * Incrementar en uno el número de bajadas de archivos (downloads) que se
     * han realizado en todo el sistema RD
     */
    public void incrementarBajadosDrep(){
        this.bajarDrep++;
    }
    /**
     * Decrementar en uno el número de bajadas de archivos (downloads) que se 
     * han realizado en todo el sistema RD 
     */
    public void decrementarBajadosDrep(){

    }
    /**
     * Obtener el número de todos los programas drep que están activos en el
     * sistema RD
     * @return  número de todos los programas drep que están activos en el
     *          sistema RD
     */
    public int getActivosDrep(){
        return this.activosDrep;
    }
    /**
     * Establece el número de todos los programas drep que están activos en el 
     * sistema RD
     * @param drep activos
     */
    public void setActivosDrep(int activos){
        this.activosDrep = activos;
    }
    /**
     * Incrementar en uno el número de todos los programas drep que están
     * activos en el sistema RD
     */
    public void incrementarActivosDrep(){
        this.activosDrep++;
    }
    /**
     * Decrementar en uno el número de todos los programas drep que están
     * activos en el sistema RD
     */
    public void decrementarActivosDrep(){
        this.activosDrep--;
    }
    /**
     * Obtener la lista de usuarios dcli activos en el sistema
     * @return  La lista de usuarios dcli activos en el sistema
     */
    public LinkedList<String> getActivosDcli(){
        return this.activosDcli;
    }
    /**
     * Establece la lista de usuarios dcli activos en el sistema
     * @param activos   Lista de usuarios dcli activos en el sistema
     */
    public void setActivosDcli(LinkedList<String> activos){
        this.activosDcli = activos;
    }

    /**
     * Ingresar un nuevo usuario dcli a la lista de usuarios dcli activos
     * @param newusr    Nombre del nuevo usuario dcli a registrar
     * @return  0 si se agrega el nuevo usuario sin problemas, -1 en otro caso
     */
    public int incrementarActivosDcli(String newusr){

        //if (activosDcli.contains(newusr)) {
        //    return 0;
        //} else {
            boolean status;
            status = activosDcli.add(newusr);
            if (status){
                System.out.println("\nSe ha conectado un nuevo usuario " +
                        "dcli username: "+newusr);
                return 0;
            } else {
                return -1;
            }
        //}

    }

    /**
     * Elimina un usuario dcli de la lista de usuarios dcli activos
     * @param usr   El usuario dcli que se desea eliminar de la lista
     * @return      0 si se elimina el usuario sin problemas, -1 en otro caso
     */
    public int decrementarActivosDcli (String usr){
        ErrorHandler errorH = new ErrorHandler();
        if(!activosDcli.contains(usr)){
            errorH.errorUsuarioNoExiste(usr);
            return -1;
        } else {
            boolean status;
            status = activosDcli.remove(usr);
            if (status){
                System.out.println("Se ha desconectado un" +
                        " usuario Dcli username: "+usr);
                return 0;
            } else {
                return -1;
            }
        }
    }

    /**
     * Función que muestra en pantalla todos los usuarios dcli activos en
     * el sistema
     */
    public void tuser(){
        
        LinkedList<String> usuariosDcli = this.activosDcli;
        Iterator<String> listaUsr = usuariosDcli.descendingIterator();
        if (usuariosDcli.isEmpty()){
            //Directorio no existe o no es un directorio
            System.out.println("Actualmente no existen usuarios Dcli conectados");
        } else {
            System.out.println("Usuarios Dcli conectados");
            System.out.println("-------------------");
            while(listaUsr.hasNext()){
                System.out.println(listaUsr.next());
            }
        }
    }

    /**
     * Obtiene el estado del servidor Dmon, esto permite controlar el ciclo de
     * servicio del servidor.
     * @return  true si esta activado el servidor, false sino
     */
    public boolean getStatus(){
        return this.listening;
    }
    /**
     * Establece el estado del servidor en false
     */
    public void setStatusOff(){
        this.listening = false;
    }
    /**
     * Establece el estado del servidor en true
     */
    public void setStatusOn(){
        this.listening = true;
    }

}
